home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / MRQ.lha / MRQ / Source / RCS / config.c next >
C/C++ Source or Header  |  2000-10-16  |  13KB  |  576 lines

  1. head    1.4;
  2. access;
  3. symbols;
  4. locks
  5.     msbethke:1.4; strict;
  6. comment    @ * @;
  7.  
  8.  
  9. 1.4
  10. date    2000.10.15.13.29.23;    author msbethke;    state Exp;
  11. branches;
  12. next    1.3;
  13.  
  14. 1.3
  15. date    2000.10.15.12.51.25;    author msbethke;    state Exp;
  16. branches;
  17. next    1.2;
  18.  
  19. 1.2
  20. date    2000.01.25.17.28.45;    author msbethke;    state Exp;
  21. branches;
  22. next    1.1;
  23.  
  24. 1.1
  25. date    2000.01.25.17.20.15;    author msbethke;    state Exp;
  26. branches;
  27. next    ;
  28.  
  29.  
  30. desc
  31. @Handles the processing of MRQ's configfile
  32. @
  33.  
  34.  
  35. 1.4
  36. log
  37. @oops - forgot an argument to the warning message...
  38. @
  39. text
  40. @/* config.c
  41. ** Handles the processing of MRQ's configfile
  42. **
  43. ** ©1997-2000 by Matthias.Bethke <Matthias.Bethke@@gmx.net>
  44. ** You are free to modify this source or use parts of it in your
  45. ** own programs as long as they are distributed as freeware.
  46. */
  47.  
  48. /* $Id: config.c 1.3 2000/10/15 12:51:25 msbethke Exp msbethke $
  49. **
  50. ** $Log: config.c $
  51. ** Revision 1.3  2000/10/15 12:51:25  msbethke
  52. ** Additional warning in FillDefaultClass()
  53. **
  54. ** Revision 1.2  2000/01/25 17:28:45  msbethke
  55. ** Adapted to new header names
  56. **
  57. ** Revision 1.1  2000/01/25 17:20:15  msbethke
  58. ** Initial revision
  59. **
  60. **
  61. */
  62.  
  63. #include <proto/exec.h>
  64. #include <proto/dos.h>
  65. #include <proto/locale.h>
  66. #include <proto/intuition.h>
  67. #include <exec/memory.h>
  68. #include <lib/mb_utils.h>
  69. #include <string.h>
  70. #include <stdlib.h>
  71. #include <ctype.h>
  72. #include "mrq.h"
  73. #include "config.h"
  74. #include "gfxfiles.h"
  75.  
  76.  
  77. /* local protos */
  78. static STRPTR AddMiscClassString(STRPTR,struct MRQConfig*,STRPTR*,STRPTR);
  79. static STRPTR AddLocalizedString(STRPTR,LONG,struct MRQConfig*,ULONG);
  80. static STRPTR AddMRQString(STRPTR,struct MRQConfig*,ULONG);
  81. static void FillDefaultClass(struct MRQConfig*);
  82. static STRPTR MkImagePath(STRPTR);
  83.  
  84.  
  85.  
  86. struct MRQConfig *ReadMRQConfig(STRPTR Name)
  87. {
  88. STRPTR err=NULL;
  89. static struct MRQConfig Config={0};
  90.  
  91.     prdebug("ReadMRQConfig()\n");
  92.     if(Config.mc_MemPool = CreatePool(MEMF_ANY | MEMF_CLEAR,1024,512))
  93.     {
  94.     BPTR fh;
  95.  
  96.  
  97.         if(ttVars.AvoidTasks)        // store AVOIDTASKS pattern preparsed
  98.         {
  99.         STRPTR t;
  100.         LONG destlen;
  101.  
  102.             destlen = strlen(ttVars.AvoidTasks)*2+2;
  103.             if(t = AllocVecPooled(Config.mc_MemPool,destlen))
  104.             {
  105.                 if(ParsePattern(ttVars.AvoidTasks,t,destlen) == -1)
  106.                 {
  107.                     err = MRQERROR_BADPATTERN;
  108.                 } else ttVars.AvoidTasks = t;
  109.             } else err=MRQERROR_NOMEMORY;
  110.         }
  111.  
  112.         if(ttVars.IButtonsByText)
  113.         {
  114.         STRPTR s;
  115.  
  116.             if(s = AllocVecPooled(Config.mc_MemPool,strlen(ttVars.IButtonsByText)+1))
  117.             {
  118.                 strcpy(s,ttVars.IButtonsByText);
  119.                 Config.mc_IButton_Yes.mib_Text    = strtok(s,",");
  120.                 Config.mc_IButton_No.mib_Text        = strtok(NULL,",");
  121.                 Config.mc_IButton_Cancel.mib_Text= strtok(NULL,",");
  122.                 if(Config.mc_IButton_Yes.mib_Text &&
  123.                     Config.mc_IButton_No.mib_Text    &&
  124.                     Config.mc_IButton_Cancel.mib_Text)
  125.                 {
  126.                     prdebug("ImageButton matchtexts:\n\tYes   : %s\n\tNo    : %s\n\tCancel: %s\n",
  127.                         Config.mc_IButton_Yes.mib_Text,
  128.                         Config.mc_IButton_No.mib_Text,
  129.                         Config.mc_IButton_Cancel.mib_Text);
  130.                 } else
  131.                 {
  132.                     prdebug("Specify exactly one pattern for YES, NO and CANCEL,\nseparated by commas, for IBUTTONSBYTEXT!\n");
  133.                     ttVars.IButtonsByText = NULL;
  134.                     FreeVecPooled(Config.mc_MemPool,s);
  135.                 }
  136.             } else err = MRQERROR_NOMEMORY;
  137.         }
  138.         ReadImageButtons(&Config);
  139.         FillDefaultClass(&Config);
  140.  
  141.         NewList((struct List*)(&Config.mc_ClassList));
  142.  
  143.         if(!err && (fh = Open(Name,MODE_OLDFILE)))
  144.         {
  145.         struct RDArgs *rda, *fargs;
  146.  
  147.             prdebug("Reading configfile\n");
  148.             if(rda = AllocDosObjectTagList(DOS_RDARGS,NULL))
  149.             {
  150.             UBYTE LBuf[512];
  151.             struct Arguments args;
  152.             LONG line=0;
  153.             ULONG Flags;
  154.  
  155.                 while(FGets(fh,LBuf,sizeof(LBuf)) && (!err))
  156.                 {
  157.                     line++;
  158.                     memset(&args,0,sizeof(args));
  159.  
  160.                     rda->RDA_Source.CS_Buffer = LBuf;
  161.                     rda->RDA_Source.CS_Length = strlen(LBuf);
  162.                     rda->RDA_Source.CS_CurChr = 0;
  163.                     rda->RDA_Buffer = NULL;
  164.                     rda->RDA_BufSiz = 0;
  165.                     rda->RDA_Flags  = RDAF_NOPROMPT;
  166.  
  167.                     if(LBuf[rda->RDA_Source.CS_Length-1] != '\n')
  168.                         LBuf[rda->RDA_Source.CS_Length++] = '\n';
  169.  
  170.                     if(!(fargs = ReadArgs(CONFIG_RDAPATTERN,(LONG*)(&args),rda)))
  171.                     {
  172.                         prdebug("Parse error in line %ld, continuing...\n",line);
  173.                         continue;
  174.                     }
  175.  
  176.  
  177.                     Flags = 0;
  178.                     if(args.Substring)    Flags |= MSF_SUBSTRING;
  179.                     if(args.Pattern)        Flags |= MSF_PATTERN;
  180.                     if(args.NoCase)        Flags |= MSF_NOCASE;
  181.                     if(args.Formatted)    Flags |= MSF_FORMATTED;
  182.                     if((Flags & MSF_SUBSTRING) && (Flags & MSF_PATTERN))
  183.                     {
  184.                         prdebug("Warning: PATTERN and SUBSTRING are mutually exclusive (line %ld)!\n",(LONG)line);
  185.                         Flags &= ~MSF_SUBSTRING;
  186.                     }
  187.  
  188.  
  189.                     if(args.NewClass)
  190.                     {
  191.                     struct MRQEventClass *class;
  192.  
  193.                         if(class = AllocVecPooled(Config.mc_MemPool,sizeof(struct MRQEventClass)))
  194.                         {
  195.                             NewList((struct List*)(&(class->mec_StringList)));
  196.                             AddTail((struct List*)(&Config.mc_ClassList),(struct Node*)class);
  197.                         } else err = MRQERROR_NOMEMORY;
  198.                     }
  199.  
  200.                     else if(args.Locale)
  201.                     {
  202.                     STRPTR LocName;
  203.                     int ArgNum;
  204.                     
  205.                         LocName = *args.Locale;
  206.  
  207.                         if(args.Locale[1])
  208.                         {
  209.                         LONG StringNum;
  210.  
  211.                             for(ArgNum=1; args.Locale[ArgNum] && !err ; ArgNum++)
  212.                             {
  213.                                 StringNum = strtol(args.Locale[ArgNum],NULL,10);
  214.                                 err = AddLocalizedString(LocName,StringNum,&Config,Flags);
  215.                             }
  216.                         } else prdebug("Dubious or missing parameter in line %ld: %s\n",line,LocName);
  217.                     }
  218.  
  219.                     else if(args.String)
  220.                     {
  221.                         if(err = AddMRQString(args.String,&Config,Flags)) break;
  222.                     }
  223.  
  224.                     else if(args.Image)
  225.                     {
  226.                     STRPTR tmpimgname;
  227.                     struct MRQImage *img;
  228.  
  229.                         tmpimgname = MkImagePath(args.Image);
  230.                         img = &(((struct MRQEventClass*)(Config.mc_ClassList.mlh_TailPred))->mec_Image);
  231.  
  232.                         if(args.Transparent)    img->mi_Flags |= MIF_TRANSPARENT;
  233.                         if(args.Animation)    img->mi_Flags |= MIF_ANIMATION;
  234.     
  235.                         if(args.Preload)
  236.                         {
  237.                             if(PreloadImage(tmpimgname,img))
  238.                             {
  239.                                 prdebug("Preloaded image '%s'\n",args.Image);
  240.                             } else err = MRQERROR_LOADIMAGE;
  241.                         } else
  242.                         {
  243.                             AddMiscClassString(tmpimgname,&Config,(STRPTR*)(&img->mi_Object),"an image");
  244.                             img->mi_Flags |= MIF_FILENAME;
  245.                         }
  246.                         FreeVec(tmpimgname);
  247.                     }
  248.  
  249.                     else if(args.RxPort || args.RxCmd)
  250.                     {
  251.                         if(args.RxPort)
  252.                         {
  253.                             err = AddMiscClassString(args.RxPort,&Config,&(((struct MRQEventClass*)(Config.mc_ClassList.mlh_TailPred))->mec_RxPortName),"an ARexx port");
  254.                         }
  255.  
  256.                         if(args.RxCmd && !err)
  257.                         {
  258.                             err = AddMiscClassString(args.RxCmd,&Config,&(((struct MRQEventClass*)(Config.mc_ClassList.mlh_TailPred))->mec_RxCmdString),"an ARexx command");
  259.                         }
  260.                     }
  261.                     FreeArgs(fargs);
  262.                 }
  263.                 FreeDosObject(DOS_RDARGS,rda);
  264.             } else err = MRQERROR_NOMEMORY;
  265.             Close(fh);
  266.         } else err = MRQERROR_NOCONFIGFILE;
  267.     } else err=MRQERROR_NOMEMORY;
  268.  
  269.     if(err || IsListEmpty((struct List*)(&Config.mc_ClassList)))
  270.     {
  271.         DeletePool(Config.mc_MemPool);
  272.         prdebug(err ?    "Initialization error: %s!\n" :
  273.                             "Config file doesn't contain any class definitions!\n",err);
  274.         return NULL;
  275.     } else prdebug("Configfile read OK\n");
  276.     return &Config;
  277. }
  278.  
  279. void FreeMRQConfig(struct MRQConfig *cfg) 
  280. {
  281.     FreeImageButtons(cfg);
  282.     FreePreloaded(cfg);
  283.     DeletePool(cfg->mc_MemPool);
  284. }
  285.  
  286. static STRPTR AddLocalizedString(STRPTR CatName, LONG StringNum, struct MRQConfig *cfg, ULONG Flags)
  287. {
  288. struct Catalog *cat;
  289. STRPTR ret=NULL;
  290.  
  291.     if(cat = OpenCatalogA(NULL,CatName,NULL))
  292.     {
  293.     STRPTR s;
  294.  
  295.         if(s=GetCatalogStr(cat,StringNum,NULL))
  296.         {
  297.             ret = AddMRQString(s,cfg,Flags);
  298.         } else
  299.         {
  300.             prdebug("Can't read string #%ld from catalog %s!\n",StringNum,CatName);
  301.             ret = "GetCatalogStr() failed";
  302.         }
  303.         CloseCatalog(cat);
  304.     }
  305.     return ret;
  306. }
  307.  
  308. static STRPTR AddMRQString(STRPTR s, struct MRQConfig *cfg, ULONG Flags)
  309. {
  310. struct MRQString *mstr;
  311. ULONG slen;
  312.  
  313.     if(cfg->mc_ClassList.mlh_TailPred == (struct MinNode*)(&cfg->mc_ClassList))
  314.     {
  315.         prdebug("Can't add a string without a class!\n");
  316.         return MRQERROR_CONFIGFORMAT;
  317.     }
  318.  
  319.     slen = strlen(s)+2;
  320.     if(Flags & MSF_PATTERN) slen <<= 1;
  321.  
  322.     if(mstr = AllocVecPooled(cfg->mc_MemPool,sizeof(struct MRQString)+slen))
  323.     {
  324.         if(Flags & MSF_PATTERN)
  325.         {
  326.         LONG iswild;
  327.  
  328.             if(Flags & MSF_NOCASE) iswild = ParsePatternNoCase(s,(STRPTR)(mstr+1),slen);
  329.             else iswild = ParsePattern(s,(STRPTR)(mstr+1),slen);
  330.             if(iswild == -1)
  331.             {
  332.                 FreeVecPooled(cfg->mc_MemPool,mstr);
  333.                 return MRQERROR_BADPATTERN;
  334.             }
  335.         } else
  336.         {
  337.             strcpy((char*)(mstr+1),s);
  338.         }
  339.  
  340.         mstr->ms_String = (STRPTR)(mstr+1);
  341.         mstr->ms_Flags  = Flags;
  342.  
  343.         AddTail((struct List*)(&((struct MRQEventClass*)(cfg->mc_ClassList.mlh_TailPred))->mec_StringList),
  344.                     (struct Node*)mstr);
  345.         return NULL;
  346.     } else return MRQERROR_NOMEMORY;
  347.     return FALSE;
  348. }
  349.  
  350. static STRPTR AddMiscClassString(STRPTR s, struct MRQConfig *cfg, STRPTR *dest, STRPTR ItemDesc)
  351. {
  352. STRPTR ret=NULL;
  353.     if(cfg->mc_ClassList.mlh_TailPred != (struct MinNode*)(&cfg->mc_ClassList))
  354.     {
  355.         if(!(*dest))
  356.         {
  357.             if(*dest = AllocVecPooled(cfg->mc_MemPool,strlen(s)+1))
  358.             {
  359.                 strcpy(*dest,s);
  360.                 return NULL;
  361.             } else ret = MRQERROR_NOMEMORY;
  362.         }
  363.     } else prdebug("Can't add %s without a class!\n",ItemDesc);
  364.     return ret;
  365. }
  366.  
  367. static STRPTR MkImagePath(STRPTR name)
  368. {
  369. STRPTR dest;
  370.  
  371.     if(strchr(name,':') || (!(ttVars.DefImageDir)))
  372.     {
  373.         if(dest = AllocVec(strlen(name)+1,MEMF_ANY))
  374.             strcpy(dest,name);
  375.     } else
  376.     {
  377.     ULONG len;
  378.  
  379.         if(dest = AllocVec(len=strlen(name)+strlen(ttVars.DefImageDir)+3,MEMF_ANY))
  380.         {
  381.             strcpy(dest,ttVars.DefImageDir);
  382.             if(!AddPart(dest,name,len))
  383.             {
  384.                 FreeVec(dest);
  385.                 dest = NULL;
  386.             }
  387.         }
  388.     }
  389.     if(dest == NULL) prdebug("MkImagePath() failed!\n");
  390.     return dest;
  391. }
  392.  
  393. static void FillDefaultClass(struct MRQConfig *cfg)
  394. {
  395. STRPTR tmpimgname, defname="MRQ_DefaultImage";
  396.  
  397.     tmpimgname = MkImagePath(defname);
  398.     if(!PreloadImage(tmpimgname,&cfg->mc_DefClass.mec_Image))
  399.         prdebug("Warning: can't load default image\n\t(%s)\n\tunrecognized requesters will not be promoted!\n",tmpimgname);
  400.     FreeVec(tmpimgname);
  401. }
  402. @
  403.  
  404.  
  405. 1.3
  406. log
  407. @Additional warning in FillDefaultClass()
  408. @
  409. text
  410. @d9 1
  411. a9 1
  412. /* $Id: config.c 1.2 2000/01/25 17:28:45 msbethke Exp msbethke $
  413. d12 3
  414. a330 1
  415. BOOL Failed=TRUE;
  416. a334 1
  417.         {
  418. a335 2
  419.             Failed = FALSE;
  420.         }        
  421. d343 5
  422. a347 2
  423.             AddPart(dest,name,len);
  424.             Failed=FALSE;
  425. d350 1
  426. a350 1
  427.     if(Failed) prdebug("MkImagePath() failed!\n");
  428. d360 1
  429. a360 1
  430.         prdebug("Warning: can't load default image\n\t(%s)\n\tunrecognized requesters will not be promoted!\n");
  431. @
  432.  
  433.  
  434. 1.2
  435. log
  436. @Adapted to new header names
  437. @
  438. text
  439. @d9 1
  440. a9 1
  441. /* $Id: config.c 1.1 2000/01/25 17:20:15 msbethke Exp msbethke $
  442. d12 3
  443. d34 1
  444. d36 3
  445. a38 3
  446. static BOOL AddMiscClassString(STRPTR,struct MRQConfig*,STRPTR*,STRPTR);
  447. static BOOL AddLocalizedString(STRPTR,LONG,struct MRQConfig*,ULONG);
  448. static BOOL AddMRQString(STRPTR,struct MRQConfig*,ULONG);
  449. d46 1
  450. a46 1
  451. BOOL err=FALSE;
  452. d65 1
  453. a65 2
  454.                     prdebug("ParsePattern() for AVOIDTASKS failed!\n");
  455.                     err = TRUE;
  456. d67 1
  457. a67 1
  458.             } else err=TRUE;
  459. d94 1
  460. a94 1
  461.             }
  462. d130 1
  463. a130 1
  464.                         prdebug("Error parsing config line %ld\n",line);
  465. d155 1
  466. a155 5
  467.                         } else
  468.                         {
  469.                             prdebug("ReadMRQConfig(): out of memory!\n");
  470.                             err = TRUE;
  471.                         }
  472. d169 1
  473. a169 1
  474.                             for(ArgNum=1; args.Locale[ArgNum]; ArgNum++)
  475. d172 1
  476. a172 1
  477.                                 AddLocalizedString(LocName,StringNum,&Config,Flags);
  478. d179 1
  479. a179 1
  480.                         AddMRQString(args.String,&Config,Flags);
  481. d191 2
  482. d198 1
  483. a198 5
  484.                             } else
  485.                             {
  486.                                 prdebug("Can't load image '%s'\n",args.Image);
  487.                                 err = TRUE;
  488.                             }
  489. d211 1
  490. a211 1
  491.                             err = !AddMiscClassString(args.RxPort,&Config,&(((struct MRQEventClass*)(Config.mc_ClassList.mlh_TailPred))->mec_RxPortName),"an ARexx port");
  492. d216 1
  493. a216 1
  494.                             err = !AddMiscClassString(args.RxCmd,&Config,&(((struct MRQEventClass*)(Config.mc_ClassList.mlh_TailPred))->mec_RxCmdString),"an ARexx command");
  495. d222 1
  496. a222 5
  497.             } else
  498.             {
  499.                 prdebug("AllocDosObject() failed!\n");
  500.                 err=TRUE;
  501.             }
  502. d224 3
  503. a226 6
  504.         } else
  505.         {
  506.             prdebug("Can't open config file \"%s\"\n",Name);
  507.             err=TRUE;
  508.         }
  509.     }
  510. d230 2
  511. a231 2
  512.         prdebug(err ?    "Error while parsing the configfile!\n" :
  513.                             "Config file doesn't contain any class definitions!\n");
  514. d233 1
  515. a233 2
  516.     } 
  517.     prdebug("Config read OK\n");
  518. d244 1
  519. a244 1
  520. static BOOL AddLocalizedString(STRPTR CatName, LONG StringNum, struct MRQConfig *cfg, ULONG Flags)
  521. d247 1
  522. a247 1
  523. BOOL ret=FALSE;
  524. d256 5
  525. a260 1
  526.         } else prdebug("Can't read string #%ld from catalog %s!\n",StringNum,CatName);
  527. d266 1
  528. a266 1
  529. static BOOL AddMRQString(STRPTR s, struct MRQConfig *cfg, ULONG Flags)
  530. a270 2
  531. //    prdebug("AddMRQString(\"%-.25s%s\",%02lx)\n",s,(strlen(s)>25)?"...":"",Flags);
  532.  
  533. d274 1
  534. a274 1
  535.         return FALSE;
  536. d291 1
  537. a291 1
  538.                 return FALSE;
  539. d303 2
  540. a304 2
  541.         return TRUE;
  542.     } else prdebug("AddMRQString(): out of memory!\n");
  543. d308 1
  544. a308 1
  545. static BOOL AddMiscClassString(STRPTR s, struct MRQConfig *cfg, STRPTR *dest, STRPTR ItemDesc)
  546. d310 1
  547. d318 3
  548. a320 3
  549.                 return TRUE;
  550.             } else prdebug("AddMiscClassString(): out of memory!\n");
  551.         } else prdebug("?EXTRA IGNORED\n");
  552. d322 1
  553. a322 1
  554.     return FALSE;
  555. d357 2
  556. a358 1
  557.     PreloadImage(tmpimgname,&cfg->mc_DefClass.mec_Image);
  558. @
  559.  
  560.  
  561. 1.1
  562. log
  563. @Initial revision
  564. @
  565. text
  566. @d9 5
  567. a13 1
  568. /* $Id:$
  569. a14 1
  570. ** $Log:$
  571. d28 2
  572. a29 2
  573. #include "mrq_config.h"
  574. #include "mrq_dtypes.h"
  575. @
  576.